﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UtilZ.Dotnet.Ex.ZLog;

namespace UtilZ.Dotnet.Ex.Communication.Net.Ftp
{
    /// <summary>
    /// (ABORT)此命令使服务器终止前一个FTP服务命令以及任何相关数据传输。
    /// Abort an active file transfer.
    /// </summary>
    internal class FtpABORCommand : FtpCommandAbs
    {
        /***********************************************************************************************************
        * [ABOR]（Abort，中止）命令
        * 说明：告诉服务器中止上一次FTP服务命令及所有相关的数据传输。
        * 
        * 用法：ABOR﹝CRLF﹞
        * 参数：无。
        * 例子：
        * SendData "ABOR" + “/r/n”
        * 
        * 注释：中止命命令可以请求“特殊操作”以强行引起服务器的重视（详情请参看RFC959）。如果上一次命令已经完成（包括数据传输），就不会导致任何操作。服务器不会关闭控制连接，但必须关闭数据连接。
        * 服务器在接收到此命令时可能处于两种状态下：（1）FTP服务命令已经完成，（2）FTP服务命令尚在处理中。
        * 在第一种状态下，服务器关闭数据连接（如果它是打开的）并响应以226应答，表示已成功执行了中止命令。
        * 在第二种状态下，服务器中止正处理中的FTP服务并关闭数据连接，返回426应答，表示该服务请求被异常终止。然后服务器发送226应答，表示成功执行了中止命令。
        * 225  数据连接打开，没有正在进行的传输
        * 226  关闭数据连接，请求的文件操作成功。
        * 421  服务不可用，关闭控制连接。
        * 426  结束连接。
        * 
        * 如果某项服务获知自己即将关闭，会向所有命令做出这个应答。
        * 226  连接关闭，传输终止。
        * 500  语法错误，无法识别命令。
        * 
        * 这其中包括命令行过长之类的错误。
        * 501  参数或变元中有语法错误。
        * 502  命令还没有被实现。
        * 
        ************************************************************************************************************/


        public FtpABORCommand()
            : base()
        {

        }

        protected override string[] GetNames()
        {
            return new string[] { FtpCommands.ABOR, FtpCommands.ABOT };
        }

        protected override IFtpResponse PrimitiveExcute(FtpSession session, string command, string commandLine)
        {
            try
            {
                session.AbortDataTranfer();
                return new FtpCodeResponse(FtpStatusCodes.Code426);
                //return new FtpCodeResponse(FtpStatusCodes.Code226, "Transfer cancell.");
            }
            catch (Exception ex)
            {
                return new FtpCodeResponse(FtpStatusCodes.Code451, ex.Message);
            }
        }
    }

}
